﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entity;
using Business;
using System.Globalization;

namespace CPEBookWeb
{
    public partial class Default : System.Web.UI.Page
    {

        /// <summary>
        /// Appelée au chargement de la page.
        /// </summary>
        /// <param name="sender">Sender de l'évènement</param>
        /// <param name="e">Arguments de l'évènement</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            // On regarde si l'utilisateur est déjà loggé
            Utilisateur utilisateur = (Utilisateur)Session["Utilisateur"];
            if (utilisateur != null)
            {
                Response.Redirect("Mur.aspx");
            }
            else
            {
                // Pas d'erreur dans les labels
                labErreurLogin.Text = "";
                labErreurInscription.Text = "";

                // Valeurs par défaut du formulaire si pas de soumission de formulaire
                if (!Page.IsPostBack || tbLogin.Text != "")
                    remiseAZeroFormulaireInscription();
            }
        }

        /// <summary>
        /// Appelée lors d'un clic sur "Connexion".
        /// </summary>
        /// <param name="sender">Sender de l'évènement</param>
        /// <param name="e">Arguments de l'évènement</param>
        protected void btnLogin_Click(object sender, EventArgs e)
        {
            string email = tbLogin.Text;
            string password = tbPassword.Text;

            // Formulaire soumis vide
            if (email == "")
                return;

            // Recherche de l'encart pour les messages d'erreurs
            Panel panelErreurs = (Panel)Page.FindControl("panelLoginError");

            // On cherche l'utilisateur
            Utilisateur utilisateur = null;
            if ( !UtilisateurService.emailExiste(email) )
            {
                labErreurLogin.Text = "Cet utilisateur n'existe pas.";
                panelErreurs.CssClass = "error";
            }
            else
            {
                utilisateur = UtilisateurService.getUtilisateur(email, password);
                if (utilisateur == null)
                {
                    labErreurLogin.Text = "Le mot de passe est incorrect.";
                    panelErreurs.CssClass = "error";
                }
            }

            // Si trouvé, on le met en session et on redirige sur le mur
            if (utilisateur != null)
            {
                Session["Utilisateur"] = utilisateur;
                Response.Redirect("Mur.aspx");
            }
        }

        /// <summary>
        /// Appelée lors d'un clic sur "Téléchargement".
        /// </summary>
        /// <param name="sender">Sender de l'évènement</param>
        /// <param name="e">Arguments de l'évènement</param>
        protected void btnTelecharger_Click(object sender, EventArgs e)
        {
            /* TODO : Téléchargement de l'application WinForm */
            Response.Redirect("CPEBookWin/CPEBookWin.zip");
        }

        /// <summary>
        /// Appelée lors d'un clic sur "Inscription".
        /// </summary>
        /// <param name="sender">Sender de l'évènement</param>
        /// <param name="e">Arguments de l'évènement</param>
        protected void btnInscription_Click(object sender, EventArgs e)
        {
            // Pour stocker les erreurs
            List<string> erreurs = new List<string>();

            // Récupération des champs du formulaire
            string prenom = Outils.supprimerEspaces(tbPrenom.Text);
            string nom = Outils.supprimerEspaces(tbNom.Text);
            string email = Outils.supprimerEspaces(tbEmail.Text);
            string password = tbMotDePasse.Text;
            string repeter = tbMotDePasseRepeter.Text;
            char sexe = lbSexe.SelectedValue[0];
            string filliere = lbFilliere.SelectedValue;
            int promotion = 0;
            DateTime datenaissance = new DateTime();
            string datenaissanceText = Outils.supprimerEspaces(tbDateNaissance.Text);

            // Vérification des entrées
            if (prenom.Length < 0)
                erreurs.Add("Entrez un prénom.");
            else if (prenom.Length > 12)
                erreurs.Add("Prénom trop long (12 caractères max).");
            if (nom.Length < 0)
                erreurs.Add("Entrez un nom.");
            else if(nom.Length > 12)
                erreurs.Add("Nom trop long (12 caractères max).");
            if (email.Length < 0)
                erreurs.Add("Entrez un e-mail.");
            else if(email.Length > 40)
                erreurs.Add("E-mail trop long (40 caractères max).");
            else if (!Outils.verifierEmail(email))
                erreurs.Add("E-mail invalide.");
            if (password != repeter)
                erreurs.Add("Les deux mots de passe diffèrent.");
            else if (password.Length > 64)
                erreurs.Add("Mot de passe trop long (64 caractères max).");
            if (sexe != Sexe.MASCULIN && sexe != Sexe.FEMININ)
                erreurs.Add("Sexe invalide.");
            if (!Filliere.getFillieres().Contains(filliere))
                erreurs.Add("Fillière invalide.");
            if( !Int32.TryParse(tbPromotion.Text, out promotion) )
                erreurs.Add("Promotion invalide.");
            else if (promotion < 1900 && promotion > 2099)
                erreurs.Add("Promotion invalide.");
            if (datenaissanceText == null)
                erreurs.Add("Choisissez une date de naissance");
            else
            {
                // Vérification de la date
                CultureInfo cult = new CultureInfo("fr-FR");
                DateTimeStyles stl = DateTimeStyles.AssumeLocal;
                if (!DateTime.TryParse(datenaissanceText, cult, stl, out datenaissance))
                    erreurs.Add("Date de naissance invalide.");
            }

            // On vérifie que cet e-mail n'est pas déjà utilisé
            if (erreurs.Count == 0 && UtilisateurService.emailExiste(email))
			    erreurs.Add("Impossible d'inscrire cet e-mail puisqu'il est déjà dans la base.");

            // Si aucune erreur on va ajouter l'utilisateur
            if (erreurs.Count == 0)
            {
                // On met le prénom et nom au bon format
                prenom = Outils.premiereLettreMajuscule(prenom);
                nom = Outils.premiereLettreMajuscule(nom);

                // Appel du service métier
                Utilisateur utilisateur = UtilisateurService.creerUtilisateur(prenom, nom, email, password, sexe, filliere, promotion, datenaissance);

                // On met en session et on redirige sur le mur
                Session["Utilisateur"] = utilisateur;
                Response.Redirect("Nouveau.aspx");
            }
            else
            {
                // Sinon on concatène les erreurs
                string chaine = "";
                foreach (string erreur in erreurs)
	            {
		            chaine += erreur + " \n";
	            }

                // On les affiche
                labErreurInscription.Text = chaine;
            }

        }

        /// <summary>
        /// Remet à zéro tous les champs du formulaire d'inscription.
        /// </summary>
        private void remiseAZeroFormulaireInscription() {

            tbPrenom.Text = "";
            tbNom.Text = "";
            tbEmail.Text = "";
            tbMotDePasse.Text = "";
            tbMotDePasseRepeter.Text = "";
            lbSexe.SelectedIndex = 0;
            lbFilliere.SelectedIndex = 0;
            tbPromotion.Text = "";
            tbDateNaissance.Text = "";
        }

    }
}
